package com.myblockchain.service;

import com.myblockchain.service.model.Block;
import com.myblockchain.service.model.Transaction;
import com.myblockchain.service.model.Wallet;

import java.util.List;

/**
 * @author Liu
 */
public interface BlockService {
    /**
     * 挖矿
     * @param toAddress 矿工钱包地址
     * @return
     */
    Block mine(String toAddress);

    /**
     * 区块链新增一个区块
     * @param block
     * @return
     */
    boolean addBlock(Block block);

    /**
     * 获取区块链最后一个区块
     * @return
     */
    Block getLatestBlock();
    /**
     * 创建一笔交易
     * @param sender 交易发起方钱包地址
     * @param receiver 交易接收方钱包地址
     * @param amount 交易金额
     * @return
     */
    Transaction createTransaction(Wallet sender, Wallet receiver, int amount);

    /**
     * 查询钱包余额
     * @param address 需要查询的钱包地址
     * @return
     */
    int getWalletBalance(String address);

    /**
     * 查询区块链信息
     * @return
     */
    String getBlockChain();

    /**
     * 创建新钱包
     * @return
     */
    Wallet createWallet();

    /**
     * 根据钱包地址查找对应的钱包
     * @param address 钱包地址
     * @return
     */
    Wallet findWallet(String address);

    /**
     * 返回已经打包的交易JSON串
     * @return
     */
    String findPackedTransactionList();

    /**
     * 新增其他钱包
     * @param address 钱包地址
     * @param value 钱包
     */
    void addOtherWallet(String address, Wallet value);

    /**
     * 向交易集合中添加交易
     * @param list
     */
    void addTransaction(List<Transaction> list);

    /**
     * 向已打包的交易集合中添加交易
     * @param list
     */
    void addPackedTransaction(List<Transaction> list);

    /**
     * 查询所有钱包公钥信息
     * @return
     */
    String findAllWallets();

    /**
     * 查询交易池信息
     * @return
     */
    String findTransactions();

    /**
     * 替换区块链
     * @param receiverBlockChain
     */
    void replaceChain(List<Block> receiverBlockChain);
}
